package com.cyzy.service;

import com.cyzy.config.OSSConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * 文件上传服务
 */
@Service
public class FileUploadService {
    
    @Autowired
    private OSSConfig ossConfig;
    
    /**
     * 上传头像到对象存储
     */
    public String uploadAvatar(MultipartFile file, String userId) throws IOException {
        // 验证文件
        validateImageFile(file);
        
        // 生成文件名
        String originalFilename = file.getOriginalFilename();
        String extension = getFileExtension(originalFilename);
        String fileName =  userId + "_" + System.currentTimeMillis() + extension;
        
        // 保存到本地临时目录
        String tempDir = System.getProperty("java.io.tmpdir");
        Path tempFilePath = Paths.get(tempDir, UUID.randomUUID().toString() + extension);
        file.transferTo(tempFilePath.toFile());
        
        try {
            // 上传到对象存储
            String fileUrl = uploadToOSS(tempFilePath.toFile(), fileName);
            return fileUrl;
        } finally {
            // 清理临时文件
            Files.deleteIfExists(tempFilePath);
        }
    }
    
    /**
     * 上传文件到对象存储
     */
    public String uploadFile(MultipartFile file, String folder, String userId) throws IOException {
        // 生成文件名
        String originalFilename = file.getOriginalFilename();
        String extension = getFileExtension(originalFilename);
        String fileName = folder + "/" + userId + "_" + System.currentTimeMillis() + extension;
        
        // 保存到本地临时目录
        String tempDir = System.getProperty("java.io.tmpdir");
        Path tempFilePath = Paths.get(tempDir, UUID.randomUUID().toString() + extension);
        file.transferTo(tempFilePath.toFile());
        
        try {
            // 上传到对象存储
            String fileUrl = uploadToOSS(tempFilePath.toFile(), fileName);
            return fileUrl;
        } finally {
            // 清理临时文件
            Files.deleteIfExists(tempFilePath);
        }
    }
    
    /**
     * 验证图片文件
     */
    private void validateImageFile(MultipartFile file) {
        if (file.isEmpty()) {
            throw new RuntimeException("文件不能为空");
        }
        
        // 检查文件大小（5MB）
        if (file.getSize() > 5 * 1024 * 1024) {
            throw new RuntimeException("文件大小不能超过5MB");
        }
        
        // 检查文件类型
        String contentType = file.getContentType();
        if (contentType == null || !contentType.startsWith("image/")) {
            throw new RuntimeException("只支持图片格式（JPG、PNG、GIF等）");
        }
    }
    
    /**
     * 获取文件扩展名
     */
    private String getFileExtension(String filename) {
        if (filename == null || filename.lastIndexOf('.') == -1) {
            return ".jpg"; // 默认扩展名
        }
        return filename.substring(filename.lastIndexOf('.'));
    }
    
    /**
     * 上传到对象存储
     * 这里是模拟实现，实际需要根据你的对象存储API进行调用
     */
    private String uploadToOSS(File file, String fileName) {
        try {
            // 模拟上传到对象存储
            // 实际实现需要调用OSS API
            
            // 构建文件URL
            String fileUrl = ossConfig.getEndpoint() + "/" + ossConfig.getBucketName() + "/" + fileName;
            
            // 这里应该是实际的OSS上传逻辑
            // 例如：使用OkHttp或其他HTTP客户端上传文件
            
            return fileUrl;
        } catch (Exception e) {
            throw new RuntimeException("文件上传失败: " + e.getMessage());
        }
    }
    
    /**
     * 删除对象存储中的文件
     */
    public boolean deleteFile(String fileUrl) {
        try {
            // 从URL中提取文件名
            String fileName = extractFileNameFromUrl(fileUrl);
            
            // 这里应该调用OSS删除API
            // 模拟删除成功
            return true;
        } catch (Exception e) {
            throw new RuntimeException("文件删除失败: " + e.getMessage());
        }
    }
    
    /**
     * 从URL中提取文件名
     */
    private String extractFileNameFromUrl(String fileUrl) {
        if (fileUrl == null || !fileUrl.contains("/")) {
            return "";
        }
        
        String basePath = ossConfig.getEndpoint() + "/" + ossConfig.getBucketName() + "/";
        if (fileUrl.startsWith(basePath)) {
            return fileUrl.substring(basePath.length());
        }
        
        return fileUrl.substring(fileUrl.lastIndexOf('/') + 1);
    }
}
